package org.Yiran.timetale_re.item.tool.screwdriver.core;

import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.Yiran.timetale_re.item.base.DescriptiveItem;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.IModule;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.enmu.ModuleCategory;
import org.Yiran.timetale_re.util.item.TooltipUtils;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nullable;
import java.util.List;

/**
 * 起子模块物品基类
 * <p>
 * 该类是所有起子模块物品的抽象基类，定义了模块物品的基本行为和属性。
 * 支持3个等级的模块功能。
 * </p>
 */
public abstract class ScrewdriverModuleItem extends DescriptiveItem implements IModule {
    
    // ==============================
    // 常量定义
    // ==============================
    /** 模块等级枚举 */
    public enum ModuleLevel {
        /** 基础等级 */
        BASIC(1, "basic"),
        /** 中级等级 */
        ADVANCED(2, "advanced"),
        /** 高级等级 */
        ELITE(3, "elite");
        
        private final int level;
        private final String name;
        
        ModuleLevel(int level, String name) {
            this.level = level;
            this.name = name;
        }
        
        /**
         * 获取等级数值
         *
         * @return 等级数值 (1-3)
         */
        public int getLevel() {
            return level;
        }
        
        /**
         * 获取等级名称
         *
         * @return 等级名称
         */
        public String getName() {
            return name;
        }

    }
    
    // ==============================
    // 字段定义
    // ==============================
    
    /** 模块等级 */
    protected final ModuleLevel moduleLevel;
    /** 模块等级名称键 */
    protected final String tierNameKey;
    
    // ==============================
    // 构造方法
    // ==============================

    /**
     * 起子模块物品构造函数
     * <p>
     * 创建一个指定等级的起子模块物品实例。
     * </p>
     *
     * @param moduleLevel 模块等级
     * @param tierNameKey 模块等级名称键
     */
    public ScrewdriverModuleItem(ModuleLevel moduleLevel, String tierNameKey) {
        super(new Properties().stacksTo(1));
        this.moduleLevel = moduleLevel;
        this.tierNameKey = tierNameKey;
    }
    
    // ==============================
    // 功能方法
    // ==============================

    /**
     * 获取模块ID
     * <p>
     * 返回该模块物品的ID，用于在模块系统中注册和识别。
     * </p>
     *
     * @return 模块ID
     */
    @Override
    public String getModuleId() {
        // 默认实现，返回物品的注册名作为模块ID
        return extractModuleIdFromDescription();
    }
    
    /**
     * 从物品描述ID中提取模块ID
     * <p>
     * 通过移除命名空间前缀来获取模块ID
     * </p>
     *
     * @return 模块ID
     */
    private String extractModuleIdFromDescription() {
        return this.getDescriptionId().replace("item.timetale_re.", "");
    }

    /**
     * 获取模块等级
     * <p>
     * 返回该模块物品的等级。
     * </p>
     *
     * @return 模块等级
     */
    public ModuleLevel getModuleLevel() {
        return moduleLevel;
    }
    
    /**
     * 获取模块分类
     * <p>
     * 返回该模块物品的分类，默认为属性分类。
     * </p>
     *
     * @return 模块分类
     */
    @Override
    public ModuleCategory getModuleCategory() {
        // 默认实现返回属性分类
        return ModuleCategory.ATTRIBUTE;
    }
    
    /**
     * 添加物品悬停文本提示
     * <p>
     * 重写父类方法，添加模块等级描述
     * </p>
     *
     * @param stack   物品栈
     * @param level   世界对象
     * @param tooltip 提示文本列表
     * @param flag    提示标志
     */
    @Override
    public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List<Component> tooltip, @NotNull TooltipFlag flag) {
        // 等级描述
        TooltipUtils.addModuleLevel(tooltip, tierNameKey);

        // 隔一行
        TooltipUtils.addSeparatorLine(tooltip);

        if (TooltipUtils.isShiftPressed()) {
            // 显示详细信息
            TooltipUtils.addDetailedInfo(tooltip, this.getDescriptionId());
        } else {
            // 提示按Shift查看详细信息
            TooltipUtils.addShiftPrompt(tooltip);
        }
    }
}